﻿using System;
using System.ComponentModel;

namespace Maple.Weixin.MP.Entities
{
    /// <summary>
    /// 全局返回码。
    /// </summary>
    public enum GlobalReturnCode
    {
        系统繁忙 = -1,
        请求成功 = 0,
        AppSecret错误或access_token无效 = 40001,
        不合法的凭证类型 = 40002,
        不合法的OpenID = 40003,
        不合法的媒体文件类型 = 40004,
        不合法的文件类型 = 40005,
        不合法的文件大小 = 40006,
        不合法的媒体文件id = 40007,
        不合法的消息类型 = 40008,
        不合法的图片文件大小 = 40009,
        不合法的语音文件大小 = 40010,
        不合法的视频文件大小 = 40011,
        不合法的缩略图文件大小 = 40012,
        不合法的APPID = 40013,
        不合法的access_token = 40014,
        不合法的菜单类型 = 40015,
        不合法的按钮个数1 = 40016,
        不合法的按钮个数2 = 40017,
        不合法的按钮名字长度 = 40018,
        不合法的按钮KEY长度 = 40019,
        不合法的按钮URL长度 = 40020,
        不合法的菜单版本号 = 40021,
        不合法的子菜单级数 = 40022,
        不合法的子菜单按钮个数 = 40023,
        不合法的子菜单按钮类型 = 40024,
        不合法的子菜单按钮名字长度 = 40025,
        不合法的子菜单按钮KEY长度 = 40026,
        不合法的子菜单按钮URL长度 = 40027,
        不合法的自定义菜单使用用户 = 40028,
        不合法的oauth_code = 40029,
        不合法的refresh_token = 40030,
        不合法的openid列表 = 40031,
        不合法的openid列表长度 = 40032,
        不合法的请求字符 = 40033,
        不合法的参数 = 40035,
        不合法的请求格式 = 40038,
        不合法的URL长度 = 40039,
        不合法的分组id = 40050,
        分组名字不合法 = 40051,
        缺少access_token参数 = 41001,
        缺少appid参数 = 41002,
        缺少refresh_token参数 = 41003,
        缺少secret参数 = 41004,
        缺少多媒体文件数据 = 41005,
        缺少media_id参数 = 41006,
        缺少子菜单数据 = 41007,
        缺少oauth_code = 41008,
        缺少openid = 41009,
        access_token超时 = 42001,
        refresh_token超时 = 42002,
        oauth_code超时 = 42003,
        需要GET请求 = 43001,
        需要POST请求 = 43002,
        需要HTTPS请求 = 43003,
        需要接收者关注 = 43004,
        需要好友关系 = 43005,
        多媒体文件为空 = 44001,
        POST的数据包为空 = 44002,
        图文消息内容为空 = 44003,
        文本消息内容为空 = 44004,
        多媒体文件大小超过限制 = 45001,
        消息内容超过限制 = 45002,
        标题字段超过限制 = 45003,
        描述字段超过限制 = 45004,
        链接字段超过限制 = 45005,
        图片链接字段超过限制 = 45006,
        语音播放时间超过限制 = 45007,
        图文消息超过限制 = 45008,
        接口调用超过限制 = 45009,
        创建菜单个数超过限制 = 45010,
        回复时间超过限制 = 45015,
        系统分组不允许修改 = 45016,
        分组名字过长 = 45017,
        分组数量超过上限 = 45018,
        不存在媒体数据 = 46001,
        不存在的菜单版本 = 46002,
        不存在的菜单数据 = 46003,
        不存在的用户 = 46004,
        解析JSON或XML内容错误 = 47001,
        API功能未授权 = 48001,
        用户未授权该API = 50001,
        参数错误 = 61451,
        无效客服账号 = 61452,
        账号已存在 = 61453,
        账号名长度超过限制 = 61454,
        账号名包含非法字符_英文_数字_ = 61455,
        账号个数超过限制_10个客服账号_ = 61456,
        无效头像文件类型 = 61457
    }

    /// <summary>
    /// 上传文件的媒体类型。
    /// </summary>
    public enum UploadMediaType
    {
        /// <summary>
        /// 图片。
        /// </summary>
        Image,

        /// <summary>
        /// 语音。
        /// </summary>
        Voice,

        /// <summary>
        /// 视频。
        /// </summary>
        Video,

        /// <summary>
        /// 缩略图。
        /// </summary>
        Thumb,
    }

    /// <summary>
    /// 消息类型。
    /// </summary>
    public enum RequestMessageType
    {
        /// <summary>
        /// 文本。
        /// </summary>
        Text, 

        /// <summary>
        /// 地理位置。
        /// </summary>
        Location, 
        
        /// <summary>
        /// 图片。
        /// </summary>
        Image,

        /// <summary>
        /// 语音。
        /// </summary>
        Voice,

        /// <summary>
        /// 视频。
        /// </summary>
        Video,

        /// <summary>
        /// 链接。
        /// </summary>
        Link, 

        /// <summary>
        /// 事件。
        /// </summary>
        Event, 
    }

    /// <summary>
    /// 发送消息类型
    /// </summary>
    public enum ResponseMessageType
    {
        Text,
        News,
        Music,
        Image,
        Voice,
        Video,
        Nothing,
        TransferCustomerService,
    }

    /// <summary>
    /// 事件类型。
    /// </summary>
    public enum Event
    {
        /// <summary>
        /// 地理位置。
        /// </summary>
        LOCATION,

        /// <summary>
        /// 订阅。
        /// </summary>
        subscribe,

        /// <summary>
        /// 取消订阅。
        /// </summary>
        unsubscribe,

        /// <summary>
        /// 自定义菜单点击事件。
        /// </summary>
        CLICK,

        /// <summary>
        /// 二维码扫描。
        /// </summary>
        scan,

        /// <summary>
        /// URL跳转。
        /// </summary>
        VIEW,

        ///// <summary>
        ///// 模板消息发送成功。
        ///// </summary>
        //TEMPLATESENDJOBFINISH,
    }

    /// <summary>
    /// 菜单类型。
    /// </summary>
    public enum MenuType
    {
        Parent,
        Click,
        View
    }

    public static class EnumExtensions
    {
        public static string GetName(this UploadMediaType mediaType) {
            var text = Enum.GetName(typeof (UploadMediaType), mediaType);
            return text ?? "";
        }

        public static TEnum ConvertToEnum<TEnum>(string text) {
            return (TEnum) TypeDescriptor.GetConverter(typeof (TEnum)).ConvertFromString(text);
        }
    }
}
